package class06;

public class Code01_GetMax {

	// 1 -> 0
	// 0 -> 1
	public static int flip(int n) {
		return n ^ 1;
	}

	// n 为非负数， 返回1
	// n 为负数，返回0
	public static int sign(int n) {
		return flip((n >> 31) & 1);
	}


	//没有任何比较判断
	//c可能溢出
	public static int getMax1(int a, int b) {
		int c = a - b;
		int scA = sign(c);  //a - b >= 0; sca为1，否则为0
		int scB = flip(scA);//sca为1则scb为0，sca为0则scb为1
		//互斥条件相加，只有大数
		return a * scA + b * scB;
	}

	public static int getMax2(int a, int b) {
		int c = a - b;
		//三个状态的符号
		int sa = sign(a);
		int sb = sign(b);
		int sc = sign(c);
		//a的符号与b符号一样为0，否则为1
		int difSab = sa ^ sb;
		//互斥情况
		int sameSab = flip(difSab);
		// a b 符号相同，不溢出 且 a - b大于等于 0
		// a b 符号不同，a为正数
		// 以上两种情况返回a ，两种情况互斥
		int returnA = difSab * sa + sameSab * sc;
		// 与returnA互斥
		int returnB = flip(returnA);
		return a * returnA + b * returnB;
	}

	public static void main(String[] args) {
		int a = -16;
		int b = 1;
		System.out.println(getMax1(a, b));
		System.out.println(getMax2(a, b));
		a = 2147483647;
		b = -2147480000;
		System.out.println(getMax1(a, b)); // wrong answer because of overflow
		System.out.println(getMax2(a, b));

	}

}
